{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We start, as normal, by creating a `Gobnilp` object to work with:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Academic license - for non-commercial use only\n"
     ]
    }
   ],
   "source": [
    "from gobnilp import Gobnilp\n",
    "m = Gobnilp()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we will create 'local scores' from the built-in `alarm_10000.dat` dataset:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "m.input_discrete_data('alarm_10000.dat')\n",
    "local_scores_dict = m.return_local_scores()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The computation of these local scores is not immediate, but should not take too long. Since `return_local_scores` was called with no arguments, `Gobnilp`'s default BDeu score will be used. `return_local_scores` is unusual for a `Gobnilp` method since it returns a value: a dictionary of local scores. The keys of this dictionary are the BN variables (the names of these variables are given on the first line of `alarm_10000.dat`). "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dict_keys(['ANAPHYLAXIS', 'ARTCO2', 'BP', 'CATECHOL', 'CO', 'CVP', 'DISCONNECT', 'ERRCAUTER', 'ERRLOWOUTPUT', 'EXPCO2', 'FIO2', 'HISTORY', 'HR', 'HRBP', 'HREKG', 'HRSAT', 'HYPOVOLEMIA', 'INSUFFANESTH', 'INTUBATION', 'KINKEDTUBE', 'LVEDVOLUME', 'LVFAILURE', 'MINVOL', 'MINVOLSET', 'PAP', 'PCWP', 'PRESS', 'PULMEMBOLUS', 'PVSAT', 'SAO2', 'SHUNT', 'STROKEVOLUME', 'TPR', 'VENTALV', 'VENTLUNG', 'VENTMACH', 'VENTTUBE'])\n"
     ]
    }
   ],
   "source": [
    "print(local_scores_dict.keys())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The value associated with each BN variable is a dictionary mapping potential parent sets for that variable to a local score - which states, intuitively, how good it would be for that parent set to be selected. We find that there is variation in the number of parent sets stored:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ANAPHYLAXIS 5\n",
      "ARTCO2 473\n",
      "BP 266\n",
      "CATECHOL 383\n",
      "CO 469\n",
      "CVP 32\n",
      "DISCONNECT 127\n",
      "ERRCAUTER 22\n",
      "ERRLOWOUTPUT 14\n",
      "EXPCO2 176\n",
      "FIO2 18\n",
      "HISTORY 36\n",
      "HR 154\n",
      "HRBP 135\n",
      "HREKG 122\n",
      "HRSAT 122\n",
      "HYPOVOLEMIA 57\n",
      "INSUFFANESTH 1\n",
      "INTUBATION 211\n",
      "KINKEDTUBE 41\n",
      "LVEDVOLUME 64\n",
      "LVFAILURE 84\n",
      "MINVOL 371\n",
      "MINVOLSET 96\n",
      "PAP 3\n",
      "PCWP 43\n",
      "PRESS 212\n",
      "PULMEMBOLUS 10\n",
      "PVSAT 440\n",
      "SAO2 471\n",
      "SHUNT 162\n",
      "STROKEVOLUME 109\n",
      "TPR 173\n",
      "VENTALV 472\n",
      "VENTLUNG 448\n",
      "VENTMACH 134\n",
      "VENTTUBE 317\n"
     ]
    }
   ],
   "source": [
    "for child, scored_parentsets in local_scores_dict.items():\n",
    "    print(child, len(scored_parentsets))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ANAPHYLAXIS has a mere 5 parent sets whereas ARTCO2 has 473! This is because `Gobnilp` is using *pruning*. If a variable $X$ has potential parent set $S$ which is a superset of another potential parent set $T$ which has a higher score then $S$ is 'pruned' away. This is because, assuming we do not have any special constraints on allowed BNs, we can never have an optimal BN where $S$ is a parent set, since we could always replace $S$ with $T$ and get a higher scoring BN *without creating a cycle, since we would remove arrows*.\n",
    "\n",
    "It just so happens that more parent sets were pruned for ANAPHYLAXIS than ARTCO2. Let's look at the scored parent sets for ANAPHYLAXIS:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "frozenset() -578.587070487134\n",
      "frozenset({'BP'}) -523.5582005530596\n",
      "frozenset({'CATECHOL'}) -577.4536694321869\n",
      "frozenset({'TPR'}) -471.48556937259855\n",
      "frozenset({'BP', 'HYPOVOLEMIA'}) -518.1711042499956\n"
     ]
    }
   ],
   "source": [
    "for parentset, score in local_scores_dict['ANAPHYLAXIS'].items():\n",
    "    print(parentset, score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The empty set has the worst score of the 5 - if any of the non-empty parent set had a worse score it would be pruned.\n",
    "\n",
    "Each local score will be eventually be associated with a Gurobi MIP variable called a *family variable* (since it is associated with a 'child' variable and a parent set). The fewer of these family variables the better since the MIP will be smaller and thus easier for Gurobi to solve. If we have prior knowledge then this can \n",
    "1. reduce the number of local scores, and\n",
    "2. reduce the time required to compute the local scores\n",
    "\n",
    "To provide an example of how prior knowledge can help, let's see how often variables occur in the potential parent sets for ARTCO2:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Counter({'EXPCO2': 101, 'SHUNT': 98, 'INTUBATION': 93, 'DISCONNECT': 91, 'CATECHOL': 85, 'KINKEDTUBE': 75, 'MINVOLSET': 72, 'VENTMACH': 62, 'PRESS': 60, 'SAO2': 56, 'VENTLUNG': 50, 'VENTTUBE': 50, 'HR': 49, 'HREKG': 42, 'HRSAT': 42, 'HRBP': 41, 'TPR': 40, 'PVSAT': 37, 'MINVOL': 31, 'CO': 25, 'FIO2': 12, 'BP': 7, 'VENTALV': 5, 'STROKEVOLUME': 1})\n"
     ]
    }
   ],
   "source": [
    "from collections import Counter\n",
    "d = Counter()\n",
    "for parent_set in local_scores_dict['ARTCO2']:\n",
    "    for v in parent_set:\n",
    "        d[v] += 1\n",
    "print(d)    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, for example KINKEDTUBE occurs in 75 parent sets. Now, suppose we knew that ARTCO2 and KINKEDTUNE had to be independent. Then we should provide this information to Gobnilp. We do this as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "m.add_independence(['ARTCO2'],['KINKEDTUBE'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can recompute the local scores with this new information available:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "local_scores_dict = m.return_local_scores()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And now we can check that there should be 75 fewer parents for ARTCO2, and also some reduction in the parent sets for KINKEDTUBE. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "398\n",
      "32\n"
     ]
    }
   ],
   "source": [
    "print(len(local_scores_dict['ARTCO2']))\n",
    "print(len(local_scores_dict['KINKEDTUBE']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As expected there are $398 = 473 - 75$ fewere parent sets for ARTCO2, and also some reduction in the number of parent sets for KINKEDTUBE. This is because we asserted an independence constraint, which we can get to via the `obligatroy_conditional_indepedences` attribute:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{(frozenset({'ARTCO2'}), frozenset({'KINKEDTUBE'}), frozenset())}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.obligatory_conditional_independences"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that the independence constraint is stored as a conditional independence constraint with an empty conditioning set (the 3rd set in the tuple above). Also note that `Gobnilp` is taking advantage of this constraint before a MIP problem has been created - to help reduce the number of local scores computed. Naturally this constraint is also taken into account when learning a BN (which is done by constructing and solving a MIP model) to ensure that any learned BN satisfies the constraint.\n",
    "\n",
    "When an independence (or conditional independence) constraint is added (by the user) `Gobnilp` deduces that certain other simpler constraints follow. In our current example, it is deduced that\n",
    "1. there can be no arrow between the two variables, and\n",
    "2. the two variables cannot be adjacent in the undirected skeleton"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{('ARTCO2', 'KINKEDTUBE'), ('KINKEDTUBE', 'ARTCO2')}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.forbidden_arrows"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{frozenset({'ARTCO2', 'KINKEDTUBE'})}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "m.forbidden_adjacencies"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, let's learn an optimal BN and check that it satisfies the given independence constraint. Since this is a reasonably hard BN learning problem, we'll get the output from Gurobi printed out so we can at least see the progress. We do this by setting the appropriate Gurobi attribute. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Changed value of parameter OutputFlag to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 1\n",
      "Changed value of parameter PoolSolutions to 1\n",
      "   Prev: 10  Min: 1  Max: 2000000000  Default: 10\n",
      "Changed value of parameter LazyConstraints to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 0\n",
      "Optimize a model with 2288 rows, 7349 columns and 158765 nonzeros\n",
      "Variable types: 0 continuous, 7349 integer (7349 binary)\n",
      "Coefficient statistics:\n",
      "  Matrix range     [1e+00, 1e+00]\n",
      "  Objective range  [1e+02, 1e+04]\n",
      "  Bounds range     [1e+00, 1e+00]\n",
      "  RHS range        [1e+00, 1e+00]\n",
      "Presolve removed 663 rows and 383 columns\n",
      "Presolve time: 0.68s\n",
      "Presolved: 1625 rows, 6966 columns, 85959 nonzeros\n",
      "Variable types: 0 continuous, 6966 integer (6966 binary)\n",
      "Found heuristic solution: objective -205904.1188\n",
      "Presolve removed 382 rows and 0 columns\n",
      "Presolved: 1245 rows, 6966 columns, 29748 nonzeros\n",
      "\n",
      "\n",
      "Root relaxation: objective -8.362617e+04, 208 iterations, 0.06 seconds\n",
      "\n",
      "    Nodes    |    Current Node    |     Objective Bounds      |     Work\n",
      " Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time\n",
      "\n",
      "     0     0 -83626.171    0   45 -205904.12 -83626.171  59.4%     -    1s\n",
      "     0     0 -85310.337    0   51 -205904.12 -85310.337  58.6%     -    1s\n",
      "     0     0 -85696.717    0   99 -205904.12 -85696.717  58.4%     -    1s\n",
      "     0     0 -86867.682    0  136 -205904.12 -86867.682  57.8%     -    2s\n",
      "     0     0 -88776.575    0   82 -205904.12 -88776.575  56.9%     -    2s\n",
      "     0     0 -89754.685    0  184 -205904.12 -89754.685  56.4%     -    2s\n",
      "     0     0 -91347.710    0  112 -205904.12 -91347.710  55.6%     -    3s\n",
      "     0     0 -92096.004    0  206 -205904.12 -92096.004  55.3%     -    4s\n",
      "     0     0 -94859.862    0  209 -205904.12 -94859.862  53.9%     -    4s\n",
      "     0     0 -97348.900    0  278 -205904.12 -97348.900  52.7%     -    5s\n",
      "     0     0 -97658.139    0  292 -205904.12 -97658.139  52.6%     -    5s\n",
      "     0     0 -100927.38    0  319 -205904.12 -100927.38  51.0%     -    6s\n",
      "     0     0 -101521.27    0  298 -205904.12 -101521.27  50.7%     -    8s\n",
      "     0     0 -101980.97    0  284 -205904.12 -101980.97  50.5%     -    9s\n",
      "     0     0 -102552.86    0  290 -205904.12 -102552.86  50.2%     -   10s\n",
      "     0     0 -102657.37    0  175 -205904.12 -102657.37  50.1%     -   11s\n",
      "     0     0 -102774.61    0  297 -205904.12 -102774.61  50.1%     -   11s\n",
      "     0     0 -102815.10    0  313 -205904.12 -102815.10  50.1%     -   12s\n",
      "     0     0 -103206.23    0  304 -205904.12 -103206.23  49.9%     -   14s\n",
      "     0     0 -103296.76    0  303 -205904.12 -103296.76  49.8%     -   15s\n",
      "     0     0 -103320.41    0  284 -205904.12 -103320.41  49.8%     -   16s\n",
      "     0     0 -103595.24    0  287 -205904.12 -103595.24  49.7%     -   16s\n",
      "     0     0 -103723.58    0  286 -205904.12 -103723.58  49.6%     -   18s\n",
      "     0     0 -103751.64    0  265 -205904.12 -103751.64  49.6%     -   19s\n",
      "     0     0 -103916.02    0  242 -205904.12 -103916.02  49.5%     -   20s\n",
      "     0     0 -103928.22    0  221 -205904.12 -103928.22  49.5%     -   21s\n",
      "     0     0 -104013.32    0  205 -205904.12 -104013.32  49.5%     -   21s\n",
      "     0     0 -104081.96    0  194 -205904.12 -104081.96  49.5%     -   22s\n",
      "     0     0 -104092.32    0  195 -205904.12 -104092.32  49.4%     -   23s\n",
      "     0     0 -104138.24    0  263 -205904.12 -104138.24  49.4%     -   25s\n",
      "     0     0 -104138.24    0  263 -205904.12 -104138.24  49.4%     -   30s\n",
      "     0     0 -104148.63    0  251 -205904.12 -104148.63  49.4%     -   32s\n",
      "     0     0 -104154.87    0   96 -205904.12 -104154.87  49.4%     -   33s\n",
      "     0     0 -104295.50    0  149 -205904.12 -104295.50  49.3%     -   34s\n",
      "     0     0 -104369.91    0  213 -205904.12 -104369.91  49.3%     -   35s\n",
      "     0     0 -104373.89    0  177 -205904.12 -104373.89  49.3%     -   36s\n",
      "     0     0 -104391.82    0  232 -205904.12 -104391.82  49.3%     -   37s\n",
      "     0     0 -104399.09    0  237 -205904.12 -104399.09  49.3%     -   39s\n",
      "     0     0 -104461.74    0  298 -205904.12 -104461.74  49.3%     -   40s\n",
      "     0     0 -104473.21    0  305 -205904.12 -104473.21  49.3%     -   42s\n",
      "     0     0 -104474.69    0  332 -205904.12 -104474.69  49.3%     -   43s\n",
      "     0     0 -104478.77    0  210 -205904.12 -104478.77  49.3%     -   45s\n",
      "     0     0 -104497.59    0  328 -205904.12 -104497.59  49.2%     -   47s\n",
      "     0     0 -104501.24    0  294 -205904.12 -104501.24  49.2%     -   49s\n",
      "     0     0 -104502.94    0  325 -205904.12 -104502.94  49.2%     -   49s\n",
      "     0     0 -104529.40    0  272 -205904.12 -104529.40  49.2%     -   51s\n",
      "     0     0 -104532.89    0  218 -205904.12 -104532.89  49.2%     -   54s\n",
      "     0     0 -104532.89    0  218 -205904.12 -104532.89  49.2%     -   55s\n",
      "     0     0 -104533.36    0  247 -205904.12 -104533.36  49.2%     -   55s\n",
      "     0     0 -104573.13    0  425 -205904.12 -104573.13  49.2%     -   56s\n",
      "     0     0 -104578.61    0  414 -205904.12 -104578.61  49.2%     -   57s\n",
      "     0     0 -104579.94    0  322 -205904.12 -104579.94  49.2%     -   58s\n",
      "     0     0 -104581.00    0  390 -205904.12 -104581.00  49.2%     -   59s\n",
      "     0     0 -104584.50    0  396 -205904.12 -104584.50  49.2%     -   61s\n",
      "     0     0 -104584.53    0  400 -205904.12 -104584.53  49.2%     -   61s\n",
      "     0     0 -104585.77    0  389 -205904.12 -104585.77  49.2%     -   63s\n",
      "     0     0 -104585.85    0  391 -205904.12 -104585.85  49.2%     -   63s\n",
      "     0     0 -104591.27    0  407 -205904.12 -104591.27  49.2%     -   65s\n",
      "     0     0 -104591.64    0  409 -205904.12 -104591.64  49.2%     -   66s\n",
      "     0     0 -104594.59    0  401 -205904.12 -104594.59  49.2%     -   68s\n",
      "     0     0 -104594.61    0  401 -205904.12 -104594.61  49.2%     -   68s\n",
      "     0     0 -104594.63    0  403 -205904.12 -104594.63  49.2%     -   70s\n",
      "     0     0 -104594.63    0  399 -205904.12 -104594.63  49.2%     -   72s\n",
      "     0     2 -104594.63    0  397 -205904.12 -104594.63  49.2%     -   73s\n",
      "    11    10 -104723.85    4  326 -205904.12 -104606.50  49.2%   297   75s\n",
      "    30    32 -104631.42   10  299 -205904.12 -104609.10  49.2%   212   80s\n",
      "   190   183 -105553.05   44   16 -205904.12 -104609.51  49.2%   107   85s\n",
      "   303   276 -104928.11   18  197 -205904.12 -104611.43  49.2%   101   90s\n",
      "   559   501 -105325.65   80   35 -205904.12 -104611.43  49.2%  77.8   95s\n",
      "   654   573 -105301.96    4  336 -205904.12 -104616.97  49.2%  73.7  104s\n",
      "   677   583 -106374.01   80    - -205904.12 -104629.98  49.2%  73.3  106s\n",
      "H  728   357                    -105455.6275 -104636.02  0.78%  74.3  110s\n",
      "   731   350 -104941.66    4  143 -105455.63 -104636.02  0.78%  74.0  116s\n",
      "   745   360 -105091.07   56  436 -105455.63 -104638.34  0.78%  72.6  120s\n",
      "   748   362 -105052.48    9  413 -105455.63 -104642.41  0.77%  72.3  127s\n",
      "   751   367 -104709.62   10  364 -105455.63 -104642.41  0.77%  78.9  132s\n",
      "   765   373 -104796.30   14  381 -105455.63 -104783.09  0.64%  83.1  135s\n",
      "   832   399 -105146.23   34  310 -105455.63 -104826.18  0.60%  91.1  140s\n",
      "*  908   376              42    -105351.9015 -104840.57  0.49%  92.4  143s\n",
      "H  921   351                    -105331.8158 -104840.57  0.47%  93.1  144s\n",
      "   923   349 -105225.79   18  254 -105331.82 -104840.57  0.47%  94.0  145s\n",
      "  1150   389 -105310.49   22  104 -105331.82 -104913.95  0.40%  93.7  150s\n",
      "  1301   436 -105299.19   23  184 -105331.82 -104959.01  0.35%  92.3  155s\n",
      "  1613   453 -105315.50   28  180 -105331.82 -105013.68  0.30%  90.3  160s\n",
      "  1932   544 -105250.86   25  294 -105331.82 -105042.66  0.27%  87.8  165s\n",
      "  2203   652 -105244.63   21    - -105331.82 -105070.42  0.25%  85.3  170s\n",
      "  2687   877     cutoff   18      -105331.82 -105103.90  0.22%  81.1  176s\n",
      "  2883   972 -105270.55   23  129 -105331.82 -105110.50  0.21%  79.8  180s\n",
      "  3330  1176 -105301.88   33    - -105331.82 -105124.57  0.20%  77.5  185s\n",
      "  3674  1310     cutoff   39      -105331.82 -105135.20  0.19%  76.3  190s\n",
      "  3964  1383     cutoff   22      -105331.82 -105144.73  0.18%  75.7  195s\n",
      "  4345  1469 -105307.87   43    - -105331.82 -105158.86  0.16%  75.0  201s\n",
      "  4564  1510 -105307.87   43    4 -105331.82 -105165.75  0.16%  74.8  205s\n",
      "  4944  1508 -105317.35   46   13 -105331.82 -105179.36  0.14%  74.4  210s\n",
      "  5335  1541 -105297.03   51    - -105331.82 -105190.42  0.13%  73.6  215s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  5890  1630     cutoff   57      -105331.82 -105200.06  0.13%  72.2  220s\n",
      "  6262  1640 -105311.56   34  104 -105331.82 -105210.34  0.12%  72.1  225s\n",
      "  6596  1681     cutoff   51      -105331.82 -105219.08  0.11%  71.4  231s\n",
      "  6926  1623 -105324.12   50    4 -105331.82 -105226.31  0.10%  70.9  235s\n",
      "  7385  1557 infeasible   59      -105331.82 -105234.03  0.09%  70.1  240s\n",
      "  7867  1569     cutoff   48      -105331.82 -105241.92  0.09%  68.8  246s\n",
      "  8199  1502 -105286.04   33  147 -105331.82 -105246.83  0.08%  68.0  250s\n",
      "  8716  1430 -105324.52   28   18 -105331.82 -105255.76  0.07%  67.1  255s\n",
      "  9546  1389 -105298.01   31    - -105331.82 -105263.63  0.06%  64.6  260s\n",
      " 10299  1426     cutoff   59      -105331.82 -105271.26  0.06%  61.8  265s\n",
      " 11098  1415 -105326.34   76    - -105331.82 -105275.75  0.05%  59.1  271s\n",
      " 11909  1461     cutoff   79      -105331.82 -105281.30  0.05%  56.4  276s\n",
      " 12655  1525 -105298.01   39    - -105331.82 -105285.14  0.04%  54.4  280s\n",
      " 13573  1582     cutoff   27      -105331.82 -105289.41  0.04%  52.1  288s\n",
      "H13577  1582                    -105331.8157 -105289.41  0.04%  52.1  288s\n",
      " 13828  1498     cutoff   54      -105331.82 -105291.46  0.04%  51.6  290s\n",
      " 14802  1513 -105330.38   34    - -105331.82 -105295.11  0.03%  49.2  295s\n",
      " 15790  1496     cutoff   47      -105331.82 -105298.41  0.03%  47.1  300s\n",
      " 17150  1313     cutoff   28      -105331.82 -105302.74  0.03%  44.5  305s\n",
      " 18256  1079     cutoff   35      -105331.82 -105307.38  0.02%  42.8  310s\n",
      " 19475   749     cutoff   48      -105331.82 -105313.75  0.02%  41.0  315s\n",
      " 20804   186     cutoff   51      -105331.82 -105327.03  0.00%  39.1  320s\n",
      "\n",
      "Cutting planes:\n",
      "  User: 173\n",
      "  Gomory: 5\n",
      "  Cover: 4\n",
      "  Flow cover: 6\n",
      "  Inf proof: 1\n",
      "  Zero half: 57\n",
      "  Lazy constraints: 1153\n",
      "\n",
      "Explored 21101 nodes (823351 simplex iterations) in 321.03 seconds\n",
      "Thread count was 4 (of 4 available processors)\n",
      "\n",
      "Solution count 1: -105332 \n",
      "\n",
      "Optimal solution found (tolerance 0.00e+00)\n",
      "Best objective -1.053318157069e+05, best bound -1.053318157069e+05, gap 0.0000%\n",
      "Parameter SolutionNumber unchanged\n",
      "   Value: 0  Min: 0  Max: 2000000000  Default: 0\n",
      "**********\n",
      "BN has score -105331.81570690058\n",
      "**********\n",
      "ANAPHYLAXIS<-TPR -471.48556937259855\n",
      "TPR<- -10901.914716929197\n",
      "ARTCO2<- -6994.266672414422\n",
      "BP<-CO,TPR -4927.804606748883\n",
      "CO<-HR,STROKEVOLUME -2678.9117199075263\n",
      "CATECHOL<-ARTCO2,TPR -1521.3018734225625\n",
      "STROKEVOLUME<-HYPOVOLEMIA,LVFAILURE -4437.288938131533\n",
      "HR<-CATECHOL -3744.599767304855\n",
      "CVP<-LVEDVOLUME -3006.6153021322098\n",
      "LVEDVOLUME<-HYPOVOLEMIA,LVFAILURE -3613.5057310384145\n",
      "DISCONNECT<-VENTTUBE -1567.6065855929191\n",
      "VENTTUBE<-INTUBATION,KINKEDTUBE,VENTLUNG -4542.004684191837\n",
      "ERRCAUTER<- -3222.576822231058\n",
      "ERRLOWOUTPUT<- -1972.2788189759885\n",
      "EXPCO2<-ARTCO2,VENTLUNG -1772.6591272249061\n",
      "VENTLUNG<-INTUBATION,VENTALV -1274.1873171138723\n",
      "FIO2<- -1888.6286705336533\n",
      "HISTORY<-LVFAILURE -637.4903136947978\n",
      "LVFAILURE<- -2010.543210255084\n",
      "HRBP<-ERRLOWOUTPUT,HR -1331.6218853034952\n",
      "HREKG<-ERRCAUTER,HR -1507.9736736634077\n",
      "HRSAT<-ERRCAUTER,HR -1452.085102920726\n",
      "HYPOVOLEMIA<- -4990.780506105162\n",
      "INSUFFANESTH<- -3303.7325344726705\n",
      "INTUBATION<-VENTALV -1981.4352130573243\n",
      "VENTALV<-ARTCO2 -3775.1325865381805\n",
      "KINKEDTUBE<- -1558.2831144287484\n",
      "MINVOL<-INTUBATION,VENTLUNG -2061.9057414227136\n",
      "MINVOLSET<-VENTMACH -946.5564916227886\n",
      "VENTMACH<-DISCONNECT,VENTTUBE -1896.468405037347\n",
      "PAP<- -4194.791057672541\n",
      "PCWP<-LVEDVOLUME -2233.68753796065\n",
      "PRESS<-INTUBATION,KINKEDTUBE,VENTTUBE -8478.131859909445\n",
      "PULMEMBOLUS<-PAP -396.6111867858417\n",
      "PVSAT<-FIO2,VENTALV -846.3768118197768\n",
      "SAO2<-PVSAT,SHUNT -1137.5909747223777\n",
      "SHUNT<-INTUBATION,PULMEMBOLUS -2052.9806218132726\n",
      "**********\n",
      "bnlearn modelstring = \n",
      "[ANAPHYLAXIS|TPR][TPR][ARTCO2][BP|CO:TPR][CO|STROKEVOLUME:HR][CATECHOL|TPR:ARTCO2][STROKEVOLUME|LVFAILURE:HYPOVOLEMIA][HR|CATECHOL][CVP|LVEDVOLUME][LVEDVOLUME|LVFAILURE:HYPOVOLEMIA][DISCONNECT|VENTTUBE][VENTTUBE|KINKEDTUBE:INTUBATION:VENTLUNG][ERRCAUTER][ERRLOWOUTPUT][EXPCO2|VENTLUNG:ARTCO2][VENTLUNG|INTUBATION:VENTALV][FIO2][HISTORY|LVFAILURE][LVFAILURE][HRBP|HR:ERRLOWOUTPUT][HREKG|HR:ERRCAUTER][HRSAT|HR:ERRCAUTER][HYPOVOLEMIA][INSUFFANESTH][INTUBATION|VENTALV][VENTALV|ARTCO2][KINKEDTUBE][MINVOL|INTUBATION:VENTLUNG][MINVOLSET|VENTMACH][VENTMACH|VENTTUBE:DISCONNECT][PAP][PCWP|LVEDVOLUME][PRESS|VENTTUBE:KINKEDTUBE:INTUBATION][PULMEMBOLUS|PAP][PVSAT|FIO2:VENTALV][SAO2|SHUNT:PVSAT][SHUNT|INTUBATION:PULMEMBOLUS]\n",
      "**********\n",
      "CPDAG:\n",
      "Vertices: ANAPHYLAXIS,TPR,ARTCO2,BP,CO,CATECHOL,STROKEVOLUME,HR,CVP,LVEDVOLUME,DISCONNECT,VENTTUBE,ERRCAUTER,ERRLOWOUTPUT,EXPCO2,VENTLUNG,FIO2,HISTORY,LVFAILURE,HRBP,HREKG,HRSAT,HYPOVOLEMIA,INSUFFANESTH,INTUBATION,VENTALV,KINKEDTUBE,MINVOL,MINVOLSET,VENTMACH,PAP,PCWP,PRESS,PULMEMBOLUS,PVSAT,SAO2,SHUNT\n",
      "TPR-ANAPHYLAXIS\n",
      "TPR->BP\n",
      "TPR->CATECHOL\n",
      "ARTCO2->CATECHOL\n",
      "ARTCO2->EXPCO2\n",
      "ARTCO2-VENTALV\n",
      "CO->BP\n",
      "CATECHOL->HR\n",
      "STROKEVOLUME->CO\n",
      "HR->CO\n",
      "HR->HRBP\n",
      "HR->HREKG\n",
      "HR->HRSAT\n",
      "LVEDVOLUME->CVP\n",
      "LVEDVOLUME->PCWP\n",
      "DISCONNECT-VENTMACH\n",
      "VENTTUBE->DISCONNECT\n",
      "VENTTUBE->PRESS\n",
      "VENTTUBE->VENTMACH\n",
      "ERRCAUTER->HREKG\n",
      "ERRCAUTER->HRSAT\n",
      "ERRLOWOUTPUT->HRBP\n",
      "VENTLUNG->EXPCO2\n",
      "VENTLUNG-MINVOL\n",
      "VENTLUNG->VENTTUBE\n",
      "FIO2->PVSAT\n",
      "LVFAILURE-HISTORY\n",
      "LVFAILURE->LVEDVOLUME\n",
      "LVFAILURE->STROKEVOLUME\n",
      "HYPOVOLEMIA->LVEDVOLUME\n",
      "HYPOVOLEMIA->STROKEVOLUME\n",
      "INTUBATION-MINVOL\n",
      "INTUBATION->PRESS\n",
      "INTUBATION->SHUNT\n",
      "INTUBATION-VENTLUNG\n",
      "INTUBATION->VENTTUBE\n",
      "VENTALV-INTUBATION\n",
      "VENTALV->PVSAT\n",
      "VENTALV-VENTLUNG\n",
      "KINKEDTUBE->PRESS\n",
      "KINKEDTUBE->VENTTUBE\n",
      "VENTMACH->MINVOLSET\n",
      "PAP-PULMEMBOLUS\n",
      "PULMEMBOLUS->SHUNT\n",
      "PVSAT->SAO2\n",
      "SHUNT->SAO2\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m.input_local_scores(local_scores_dict) # store the computed local scores dictionary\n",
    "m.setParam('OutputFlag',True)\n",
    "m.learn() # construct a MIP model and get Gurobi to solve it"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Although this is quite a large network it is easy to see that ARTCO2 and KINKEDTUBE are indeed independent. This is because neither have any parents.\n",
    "\n",
    "Gobnilp/Gurobi took quite a while (321 seconds) to find a provably optimal BN in this case (and recall that we are running with the default parent set limit of 3 - were we to raise that solving would take longer still). As is normal Gobnilp spent some time (here 73 seconds) adding cutting planes to reduce the upper bound on the score of an optimal BN from an original upper bound of -83626.171 down to -104594.63. Then Gurobi builds a search tree by branching on the values of MIP variables, finally finding a BN with a reasonable score at node 728 of this tree. Although at this point we know that the incumbent is close to the best possible BN (gap = 0.78%) it takes quite a while longer and thousands more search nodes before we can be sure we have an optimal BN. (In fact an optimal, as opposed to close-to-optimal BN, is not found until near the end of the search at node 13577.)\n",
    "\n",
    "It is interesting to compare this to what happens when we learn from this dataset with *no extra constraints*:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Parameter OutputFlag unchanged\n",
      "   Value: 1  Min: 0  Max: 1  Default: 1\n",
      "Changed value of parameter PreCrush to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 0\n",
      "Changed value of parameter CutPasses to 100000\n",
      "   Prev: -1  Min: -1  Max: 2000000000  Default: -1\n",
      "Changed value of parameter GomoryPasses to 100000\n",
      "   Prev: -1  Min: -1  Max: 2000000000  Default: -1\n",
      "Changed value of parameter MIPFocus to 2\n",
      "   Prev: 0  Min: 0  Max: 3  Default: 0\n",
      "Changed value of parameter MIPGap to 0.0\n",
      "   Prev: 0.0001  Min: 0.0  Max: 1e+100  Default: 0.0001\n",
      "Changed value of parameter MIPGapAbs to 0.0\n",
      "   Prev: 1e-10  Min: 0.0  Max: 1e+100  Default: 1e-10\n",
      "Changed value of parameter PoolSolutions to 1\n",
      "   Prev: 10  Min: 1  Max: 2000000000  Default: 10\n",
      "Changed value of parameter LazyConstraints to 1\n",
      "   Prev: 0  Min: 0  Max: 1  Default: 0\n",
      "Optimize a model with 2304 rows, 7437 columns and 161370 nonzeros\n",
      "Variable types: 0 continuous, 7437 integer (7437 binary)\n",
      "Coefficient statistics:\n",
      "  Matrix range     [1e+00, 1e+00]\n",
      "  Objective range  [1e+02, 1e+04]\n",
      "  Bounds range     [1e+00, 1e+00]\n",
      "  RHS range        [1e+00, 1e+00]\n",
      "Presolve removed 663 rows and 382 columns\n",
      "Presolve time: 0.65s\n",
      "Presolved: 1641 rows, 7055 columns, 87103 nonzeros\n",
      "Variable types: 0 continuous, 7055 integer (7055 binary)\n",
      "Found heuristic solution: objective -205904.1188\n",
      "Presolve removed 384 rows and 0 columns\n",
      "Presolved: 1259 rows, 7055 columns, 29929 nonzeros\n",
      "\n",
      "\n",
      "Root relaxation: objective -8.362617e+04, 209 iterations, 0.09 seconds\n",
      "\n",
      "    Nodes    |    Current Node    |     Objective Bounds      |     Work\n",
      " Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time\n",
      "\n",
      "     0     0 -83626.171    0   45 -205904.12 -83626.171  59.4%     -    1s\n",
      "     0     0 -85310.337    0   51 -205904.12 -85310.337  58.6%     -    1s\n",
      "     0     0 -85879.634    0   64 -205904.12 -85879.634  58.3%     -    1s\n",
      "     0     0 -86213.541    0   48 -205904.12 -86213.541  58.1%     -    2s\n",
      "     0     0 -87161.221    0   76 -205904.12 -87161.221  57.7%     -    2s\n",
      "     0     0 -88652.518    0   83 -205904.12 -88652.518  56.9%     -    2s\n",
      "     0     0 -88709.688    0   75 -205904.12 -88709.688  56.9%     -    2s\n",
      "     0     0 -88781.794    0  121 -205904.12 -88781.794  56.9%     -    3s\n",
      "     0     0 -90260.283    0  152 -205904.12 -90260.283  56.2%     -    4s\n",
      "     0     0 -90260.283    0  152 -205904.12 -90260.283  56.2%     -    5s\n",
      "     0     0 -90578.149    0  184 -205904.12 -90578.149  56.0%     -    5s\n",
      "     0     0 -90678.455    0  214 -205904.12 -90678.455  56.0%     -    5s\n",
      "     0     0 -99019.442    0  166 -205904.12 -99019.442  51.9%     -    6s\n",
      "     0     0 -101286.41    0  281 -205904.12 -101286.41  50.8%     -    7s\n",
      "     0     0 -102499.38    0  249 -205904.12 -102499.38  50.2%     -    7s\n",
      "     0     0 -103042.55    0  289 -205904.12 -103042.55  50.0%     -    8s\n",
      "     0     0 -103258.96    0  263 -205904.12 -103258.96  49.9%     -   10s\n",
      "     0     0 -103345.34    0  262 -205904.12 -103345.34  49.8%     -   11s\n",
      "     0     0 -103462.01    0  237 -205904.12 -103462.01  49.8%     -   12s\n",
      "     0     0 -103545.27    0  198 -205904.12 -103545.27  49.7%     -   14s\n",
      "     0     0 -103619.68    0  263 -205904.12 -103619.68  49.7%     -   15s\n",
      "     0     0 -103657.43    0  250 -205904.12 -103657.43  49.7%     -   16s\n",
      "     0     0 -103720.72    0  264 -205904.12 -103720.72  49.6%     -   19s\n",
      "     0     0 -103870.08    0  326 -205904.12 -103870.08  49.6%     -   20s\n",
      "     0     0 -103914.53    0  282 -205904.12 -103914.53  49.5%     -   21s\n",
      "     0     0 -103988.37    0  222 -205904.12 -103988.37  49.5%     -   22s\n",
      "     0     0 -103998.92    0  275 -205904.12 -103998.92  49.5%     -   23s\n",
      "     0     0 -104025.73    0  271 -205904.12 -104025.73  49.5%     -   23s\n",
      "     0     0 -104115.97    0  292 -205904.12 -104115.97  49.4%     -   25s\n",
      "     0     0 -104119.56    0  283 -205904.12 -104119.56  49.4%     -   27s\n",
      "     0     0 -104134.11    0  268 -205904.12 -104134.11  49.4%     -   27s\n",
      "     0     0 -104136.94    0  280 -205904.12 -104136.94  49.4%     -   28s\n",
      "     0     0 -104154.49    0  128 -205904.12 -104154.49  49.4%     -   29s\n",
      "     0     0 -104155.01    0  118 -205904.12 -104155.01  49.4%     -   29s\n",
      "     0     0 -104222.59    0  226 -205904.12 -104222.59  49.4%     -   30s\n",
      "     0     0 -104230.04    0  250 -205904.12 -104230.04  49.4%     -   31s\n",
      "     0     0 -104288.20    0  270 -205904.12 -104288.20  49.4%     -   33s\n",
      "H    0     0                    -107879.8323 -104288.20  3.33%     -   34s\n",
      "     0     0 -104298.80    0  237 -107879.83 -104298.80  3.32%     -   34s\n",
      "     0     0 -104299.23    0  197 -107879.83 -104299.23  3.32%     -   35s\n",
      "     0     0 -104351.34    0  231 -107879.83 -104351.34  3.27%     -   36s\n",
      "     0     0 -104351.34    0  231 -107879.83 -104351.34  3.27%     -   40s\n",
      "     0     0 -104377.89    0  230 -107879.83 -104377.89  3.25%     -   42s\n",
      "     0     0 -104383.20    0  224 -107879.83 -104383.20  3.24%     -   43s\n",
      "     0     0 -104383.88    0  224 -107879.83 -104383.88  3.24%     -   44s\n",
      "     0     0 -104409.67    0  272 -107879.83 -104409.67  3.22%     -   45s\n",
      "     0     0 -104413.43    0  223 -107879.83 -104413.43  3.21%     -   46s\n",
      "     0     0 -104413.64    0  263 -107879.83 -104413.64  3.21%     -   46s\n",
      "     0     0 -104418.71    0  217 -107879.83 -104418.71  3.21%     -   48s\n",
      "H    0     0                    -107649.8467 -104418.71  3.00%     -   48s\n",
      "     0     0 -104426.43    0  258 -107649.85 -104426.43  2.99%     -   49s\n",
      "     0     0 -104426.43    0  258 -107649.85 -104426.43  2.99%     -   50s\n",
      "     0     0 -104429.51    0  294 -107649.85 -104429.51  2.99%     -   51s\n",
      "     0     0 -104430.35    0  303 -107649.85 -104430.35  2.99%     -   52s\n",
      "     0     0 -104464.19    0  251 -107649.85 -104464.19  2.96%     -   53s\n",
      "H    0     0                    -106681.3986 -104464.19  2.08%     -   53s\n",
      "     0     0 -104467.05    0  365 -106681.40 -104467.05  2.08%     -   55s\n",
      "     0     0 -104467.39    0  263 -106681.40 -104467.39  2.08%     -   55s\n",
      "     0     0 -104500.70    0  365 -106681.40 -104500.70  2.04%     -   57s\n",
      "     0     0 -104503.28    0  380 -106681.40 -104503.28  2.04%     -   58s\n",
      "     0     0 -104505.34    0  234 -106681.40 -104505.34  2.04%     -   59s\n",
      "     0     0 -104512.14    0  301 -106681.40 -104512.14  2.03%     -   60s\n",
      "H    0     0                    -105594.1435 -104512.14  1.02%     -   61s\n",
      "     0     0 -104512.45    0  301 -105594.14 -104512.45  1.02%     -   61s\n",
      "     0     0 -104523.07    0  393 -105594.14 -104523.07  1.01%     -   63s\n",
      "     0     0 -104525.28    0  411 -105594.14 -104525.28  1.01%     -   64s\n",
      "     0     0 -104526.63    0  425 -105594.14 -104526.63  1.01%     -   65s\n",
      "     0     0 -104535.58    0  426 -105594.14 -104535.58  1.00%     -   68s\n",
      "     0     0 -104536.90    0  425 -105594.14 -104536.90  1.00%     -   70s\n",
      "     0     0 -104546.45    0  389 -105594.14 -104546.45  0.99%     -   72s\n",
      "     0     0 -104548.03    0  403 -105594.14 -104548.03  0.99%     -   73s\n",
      "     0     0 -104549.43    0  414 -105594.14 -104549.43  0.99%     -   76s\n",
      "     0     0 -104549.88    0  376 -105594.14 -104549.88  0.99%     -   77s\n",
      "     0     0 -104550.86    0  338 -105594.14 -104550.86  0.99%     -   79s\n",
      "     0     0 -104550.91    0  403 -105594.14 -104550.91  0.99%     -   79s\n",
      "     0     0 -104552.89    0  227 -105594.14 -104552.89  0.99%     -   80s\n",
      "H    0     0                    -105572.1002 -104552.89  0.97%     -   81s\n",
      "     0     0 -104553.39    0  380 -105572.10 -104553.39  0.96%     -   81s\n",
      "     0     0 -104553.80    0  365 -105572.10 -104553.80  0.96%     -   84s\n",
      "     0     0 -104554.35    0  366 -105572.10 -104554.35  0.96%     -   85s\n",
      "     0     0 -104554.35    0  364 -105572.10 -104554.35  0.96%     -   86s\n",
      "     0     2 -104554.35    0  364 -105572.10 -104554.35  0.96%     -   87s\n",
      "    54    46 -104737.45   15  188 -105572.10 -104571.20  0.95%   138   90s\n",
      "   154   126 -105548.23   56    - -105572.10 -104571.20  0.95%   134   95s\n",
      "*  183   150              75    -105465.2831 -104571.20  0.85%   117   95s\n",
      "*  319   220             102    -105399.7729 -104639.28  0.72%   103   98s\n",
      "   405   275 -104940.99   13  226 -105399.77 -104647.67  0.71%  99.2  100s\n",
      "   654   425 -104846.25    5  236 -105399.77 -104738.12  0.63%  90.7  105s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "H  724   374                    -105290.3516 -104738.12  0.52%  92.6  106s\n",
      "   727   376 -105275.85   22  159 -105290.35 -104738.12  0.52%  92.2  111s\n",
      "   741   386 -105287.26   39  405 -105290.35 -104738.12  0.52%  90.5  116s\n",
      "H  741   366                    -105278.2311 -104738.12  0.51%  90.5  117s\n",
      "   746   369 -104858.14   12  393 -105278.23 -104738.12  0.51%  89.8  121s\n",
      "   751   372 -104770.76    8  426 -105278.23 -104738.12  0.51%  89.3  126s\n",
      "   752   373 -105271.59   33  416 -105278.23 -104738.12  0.51%  89.1  130s\n",
      "   759   381 -104842.04   11  379 -105278.23 -104738.12  0.51%  97.0  135s\n",
      "   801   394 -104761.94   19  284 -105278.23 -104761.94  0.49%   103  140s\n",
      "H  837   378                    -105226.5119 -104816.72  0.39%   106  142s\n",
      "   933   382 -105186.37   29   91 -105226.51 -104828.57  0.38%   109  146s\n",
      "  1060   375 -105010.88   16  235 -105226.51 -104897.64  0.31%   112  150s\n",
      "  1321   373     cutoff   18      -105226.51 -104981.06  0.23%   108  155s\n",
      "  1577   368     cutoff   18      -105226.51 -105013.84  0.20%   104  160s\n",
      "  1975   359 -105161.78   31  288 -105226.51 -105058.95  0.16%  98.5  167s\n",
      "  2194   359 -105119.09   20   46 -105226.51 -105081.15  0.14%  96.8  170s\n",
      "  2559   411     cutoff   31      -105226.51 -105093.87  0.13%  93.8  175s\n",
      "  2961   436 -105162.35   33   81 -105226.51 -105114.11  0.11%  89.9  180s\n",
      "  3539   362     cutoff   33      -105226.51 -105148.04  0.07%  86.2  185s\n",
      "  4307    24     cutoff   26      -105226.51 -105203.27  0.02%  79.8  190s\n",
      "\n",
      "Cutting planes:\n",
      "  User: 165\n",
      "  Gomory: 4\n",
      "  Cover: 1\n",
      "  Flow cover: 22\n",
      "  Zero half: 44\n",
      "  Lazy constraints: 8\n",
      "\n",
      "Explored 4380 nodes (354387 simplex iterations) in 190.20 seconds\n",
      "Thread count was 4 (of 4 available processors)\n",
      "\n",
      "Solution count 1: -105227 \n",
      "\n",
      "Optimal solution found (tolerance 0.00e+00)\n",
      "Best objective -1.052265119168e+05, best bound -1.052265119168e+05, gap 0.0000%\n",
      "Parameter SolutionNumber unchanged\n",
      "   Value: 0  Min: 0  Max: 2000000000  Default: 0\n",
      "**********\n",
      "BN has score -105226.51191678016\n",
      "**********\n",
      "ANAPHYLAXIS<-TPR -471.48556937259855\n",
      "TPR<- -10901.914716929197\n",
      "ARTCO2<-VENTALV -1816.018107669981\n",
      "VENTALV<-INTUBATION,VENTLUNG -1785.1568955858966\n",
      "BP<-CO,TPR -4927.804606748883\n",
      "CO<-HR,STROKEVOLUME -2678.9117199075263\n",
      "CATECHOL<-ARTCO2,TPR -1521.3018734225625\n",
      "STROKEVOLUME<-HYPOVOLEMIA,LVFAILURE -4437.288938131533\n",
      "HR<-CATECHOL -3744.599767304855\n",
      "CVP<-LVEDVOLUME -3006.6153021322098\n",
      "LVEDVOLUME<-HYPOVOLEMIA,LVFAILURE -3613.5057310384145\n",
      "DISCONNECT<- -3295.0317430806754\n",
      "ERRCAUTER<- -3222.576822231058\n",
      "ERRLOWOUTPUT<- -1972.2788189759885\n",
      "EXPCO2<-ARTCO2,VENTLUNG -1772.6591272249061\n",
      "VENTLUNG<-INTUBATION,KINKEDTUBE,VENTTUBE -3618.0085247885145\n",
      "FIO2<- -1888.6286705336533\n",
      "HISTORY<- -2091.7769199432223\n",
      "HRBP<-ERRLOWOUTPUT,HR -1331.6218853034952\n",
      "HREKG<-ERRCAUTER,HR -1507.9736736634077\n",
      "HRSAT<-ERRCAUTER,HR -1452.085102920726\n",
      "HYPOVOLEMIA<- -4990.780506105162\n",
      "INSUFFANESTH<- -3303.7325344726705\n",
      "INTUBATION<- -3428.3602719444025\n",
      "KINKEDTUBE<- -1558.2831144287484\n",
      "LVFAILURE<-HISTORY -556.2566040066595\n",
      "MINVOL<-INTUBATION,VENTLUNG -2061.9057414227136\n",
      "MINVOLSET<-VENTMACH -946.5564916227886\n",
      "VENTMACH<- -6169.083417643342\n",
      "PAP<-PULMEMBOLUS -4008.254809145714\n",
      "PULMEMBOLUS<- -583.1474353126687\n",
      "PCWP<-LVEDVOLUME -2233.68753796065\n",
      "PRESS<-INTUBATION,KINKEDTUBE,VENTTUBE -8478.131859909445\n",
      "VENTTUBE<-DISCONNECT,VENTMACH -1814.1386675404647\n",
      "PVSAT<-FIO2,VENTALV -846.3768118197768\n",
      "SAO2<-PVSAT,SHUNT -1137.5909747223777\n",
      "SHUNT<-INTUBATION,PULMEMBOLUS -2052.9806218132726\n",
      "**********\n",
      "bnlearn modelstring = \n",
      "[ANAPHYLAXIS|TPR][TPR][ARTCO2|VENTALV][VENTALV|INTUBATION:VENTLUNG][BP|CO:TPR][CO|STROKEVOLUME:HR][CATECHOL|TPR:ARTCO2][STROKEVOLUME|LVFAILURE:HYPOVOLEMIA][HR|CATECHOL][CVP|LVEDVOLUME][LVEDVOLUME|LVFAILURE:HYPOVOLEMIA][DISCONNECT][ERRCAUTER][ERRLOWOUTPUT][EXPCO2|VENTLUNG:ARTCO2][VENTLUNG|VENTTUBE:KINKEDTUBE:INTUBATION][FIO2][HISTORY][HRBP|HR:ERRLOWOUTPUT][HREKG|HR:ERRCAUTER][HRSAT|HR:ERRCAUTER][HYPOVOLEMIA][INSUFFANESTH][INTUBATION][KINKEDTUBE][LVFAILURE|HISTORY][MINVOL|INTUBATION:VENTLUNG][MINVOLSET|VENTMACH][VENTMACH][PAP|PULMEMBOLUS][PULMEMBOLUS][PCWP|LVEDVOLUME][PRESS|VENTTUBE:KINKEDTUBE:INTUBATION][VENTTUBE|DISCONNECT:VENTMACH][PVSAT|FIO2:VENTALV][SAO2|SHUNT:PVSAT][SHUNT|INTUBATION:PULMEMBOLUS]\n",
      "**********\n",
      "CPDAG:\n",
      "Vertices: ANAPHYLAXIS,TPR,ARTCO2,VENTALV,BP,CO,CATECHOL,STROKEVOLUME,HR,CVP,LVEDVOLUME,DISCONNECT,ERRCAUTER,ERRLOWOUTPUT,EXPCO2,VENTLUNG,FIO2,HISTORY,HRBP,HREKG,HRSAT,HYPOVOLEMIA,INSUFFANESTH,INTUBATION,KINKEDTUBE,LVFAILURE,MINVOL,MINVOLSET,VENTMACH,PAP,PULMEMBOLUS,PCWP,PRESS,VENTTUBE,PVSAT,SAO2,SHUNT\n",
      "TPR-ANAPHYLAXIS\n",
      "TPR->BP\n",
      "TPR->CATECHOL\n",
      "ARTCO2->CATECHOL\n",
      "ARTCO2->EXPCO2\n",
      "VENTALV->ARTCO2\n",
      "VENTALV->PVSAT\n",
      "CO->BP\n",
      "CATECHOL->HR\n",
      "STROKEVOLUME->CO\n",
      "HR->CO\n",
      "HR->HRBP\n",
      "HR->HREKG\n",
      "HR->HRSAT\n",
      "LVEDVOLUME->CVP\n",
      "LVEDVOLUME->PCWP\n",
      "DISCONNECT->VENTTUBE\n",
      "ERRCAUTER->HREKG\n",
      "ERRCAUTER->HRSAT\n",
      "ERRLOWOUTPUT->HRBP\n",
      "VENTLUNG->EXPCO2\n",
      "VENTLUNG->MINVOL\n",
      "VENTLUNG->VENTALV\n",
      "FIO2->PVSAT\n",
      "HISTORY-LVFAILURE\n",
      "HYPOVOLEMIA->LVEDVOLUME\n",
      "HYPOVOLEMIA->STROKEVOLUME\n",
      "INTUBATION-MINVOL\n",
      "INTUBATION->PRESS\n",
      "INTUBATION->SHUNT\n",
      "INTUBATION-VENTALV\n",
      "INTUBATION->VENTLUNG\n",
      "KINKEDTUBE->PRESS\n",
      "KINKEDTUBE->VENTLUNG\n",
      "LVFAILURE->LVEDVOLUME\n",
      "LVFAILURE->STROKEVOLUME\n",
      "VENTMACH-MINVOLSET\n",
      "VENTMACH->VENTTUBE\n",
      "PULMEMBOLUS-PAP\n",
      "PULMEMBOLUS->SHUNT\n",
      "VENTTUBE->PRESS\n",
      "VENTTUBE->VENTLUNG\n",
      "PVSAT->SAO2\n",
      "SHUNT->SAO2\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "m2 = Gobnilp(gurobi_output=True)\n",
    "m2.use_discrete_data('alarm_10000.dat')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Without the independence constraint solving takes 190 seconds (as opposed to 321 seconds), even though the set of allowed BNs is greater without the constraint. This is basically because Gobnilp is optimised for the case where the only constraint is that the BN is acyclic. \n",
    "\n",
    "The number of \"Lazy constraints\" posted in the two runs is worth examining: without the constraint there are only 8 but with the independence constraint there are 1153. This is because Gobnilp is adding constraints ruling out BNs (strictly speaking ancestral subgraphs of BNs) which do not satisfy the independence constraint. This is a crude method of enforcing (conditional) independence constraints and this adds to the slowness of solving."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
